package thread;

import java.sql.SQLOutput;

/**
 * 在使用synchronized时，会导致效率低
 *
 * 解决办法：
 * 缩小锁的范围
 */
public class SyncDemo2 {
    public static void main(String[] args) {
        //Shop shop=new Shop();
        Shop shop1=new Shop();
        Shop shop2=new Shop();
        Thread thread1=new Thread("AAAA"){
            public void run(){
                //shop.bug();
                shop1.bug();
            }
        };
        Thread thread2=new Thread("BBBB"){
            public void run(){
                //shop.bug();
                shop2.bug();
            }
        };
        thread1.start();
        thread2.start();




    }
}
class Shop{
    //public synchronized void buy(){}//同步锁
    /*
    成员方法上写 synchronized，锁对象是this，不能修改
     */
    public void bug(){
        try {
            Thread t=Thread.currentThread();
            System.out.println(t.getName()+"正在买衣服");
            Thread.sleep(5000);


            //同步代码块
            //同步监视器    同步监视器对象的选择:进入看到的要相同（抢谁锁谁，使用临界资源）
            //不能写实例化对象    可以写：1. 引用数据类型 2. 多个线程看到的必须是同一个对象
            synchronized(this) {
                System.out.println(t.getName() + "正在试穿衣服");
                Thread.sleep(5000);
            }
            System.out.println(t.getName()+"结账离开");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}